#ifndef PROBLEMA_H
#define PROBLEMA_H

#include<iostream>
#include<fstream>
#include <list>
#include <string>
#include <limits.h>
#include <ctime>
#include <sys/time.h>
#include "grasp.h"
#include "rectangulo.h"
#include "contenedor.h"
#include "heuristica.h"
#include "vns.h"
#include "multistart.h"
#include "pso.h"
#include "genetico.h"
#include "tabu.h"
#include "dispersa.h"
#include "hormigas.h"

using namespace std;
class Problema { 
  private: 
      list <Rectangulo> candidatos; //Lista de los rectángulos que no han entrado aún.
      Contenedor C;
      Heuristica * heu;
  
  public: 

      Problema();      
      
      /** 
       * Constructor
      * @param Fichero donde se encuentran la Altura y Anchura del contenedor y los Rectángulos */
      Problema (ifstream &fich); 
      
      
     /** 
      * Imprime por pantalla una lista de Rectángulos
      * @param lista de rectángulos a imprimir. 
      **/
      void Imprimir_lista (list <Rectangulo> l);
      
      /**
       * Configura la heurística a usar
       * @param Heuristica
       * */
      void setHeuristica(Heuristica heu_in);
      
      
      /**
       * Resuelve el problema
       * TODO : aquí iría lo necesario para resolver los problemas, ejemplo:
       *    generar_solución_inicial
       *    mientras_no (condicion_parada)
       *       mejorar_solucion
       *    .... etc ...
       * Hay que estudiar bien lo que hace falta para que funcione con
       * todas las heuristicas
       * */
       list <Rectangulo> resolver(int tipo);
      
      /**
       * Destructor
       * */
      ~Problema() {} // { cout << "PROBLEMA:Destructor" << endl;}
   };

#endif
